package practica.ejercicios01.dominios;

import java.util.*;

public class Jugador {
	private int id;

	private List<Carta> cartas = new ArrayList<Carta>();
	private String nombre;
	private int cantidadJugados;

	public int getCantidadJugados() {
		return cantidadJugados;
	}

	public void setCantidadJugados(int cantidadJugados) {
		this.cantidadJugados = cantidadJugados;
	}

	public Jugador(String nombre) {
		this.nombre = nombre;
		this.cantidadJugados = 0;
	}

	public void participar() {
		this.cantidadJugados = cantidadJugados + 1;

	}

	public List<Carta> descartar() {
		Comparator<Carta> comp = crearComparadorOrdenandoCartas();
		TreeSet<Carta> cartasOrdenadas = new TreeSet<Carta>(comp);
		cartasOrdenadas.addAll(cartas);
		// Collections.sort(cartas, comp);

		System.out.println("Cartas ordenadas: " + cartasOrdenadas);
		List<Carta> descartar = descartarConCartasOrdendas(cartasOrdenadas);
		cartas.removeAll(descartar);

		return descartar;
	}

	private List<Carta> descartarConCartasOrdendas(
			TreeSet<Carta> cartasOrdenadas) {
		List<Carta> descartar = new ArrayList<Carta>();

		Carta[] cs = cartasOrdenadas.toArray(new Carta[0]);
		for (int i = 0; i < cs.length; i++) {
			if (cs[i].getNumero() == 1
					&& !(cs[i].getPalo().getNombre().equals("oro"))) {
				descartar.add(cs[i]);
			} else if (i + 1 < cs.length) {
				if (cs[i].getNumero() == cs[i + 1].getNumero()) {
					descartar.add(cs[i]);
					descartar.add(cs[i + 1]);
					i++;
				}
			}
		}

		System.out.println("Descartar: " + descartar);
		return descartar;
	}

	private Comparator<Carta> crearComparadorOrdenandoCartas() {
		return new Comparator<Carta>() {
			public int compare(Carta o1, Carta o2) {
				if (o1.getNumero() > o2.getNumero())
					return 1;
				else if (o1.getNumero() < o2.getNumero())
					return -1;
				else
					return o1.getPalo().getNombre()
							.compareTo(o2.getPalo().getNombre());
			}
		};
	}

	public void agregarCarta(Carta carta) {
		cartas.add(carta);
	}

	// ///////////////////////////////////////////
	public List<Carta> getCartas() {
		return cartas;
	}

	public void setCartas(List<Carta> cartas) {
		this.cartas = cartas;
	}

	public String getNombre() {
		return nombre;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public List<Carta> robar(Jugador k) {
		System.out.println("Jugador " + this.nombre + "("
				+ this.getCartas().size() + ")" + " roba a " + k.getNombre()
				+ "(" + k.getCartas().size() + ")");
		int numeroCartas = k.getCartas().size();
		Random rnd = new Random();
		Carta c = k.entregar(rnd.nextInt(numeroCartas));
		cartas.add(c);
		return descartar();
	}

	private Carta entregar(int i) {
		Carta c = cartas.get(i);
		cartas.remove(i);
		return c;
	}

	public void mostrarCartas() {
		System.out.println(nombre + " tiene {");
		for (Carta carta : cartas) {
			System.out.println("\tCarta: " + carta);
		}
		System.out.println("} Total: " + cartas.size());
	}
}
